package com.note.feng.leetcode.algorithms.easy;

public class HundredSixtyNine {

    /**
     * 169 多数元素
     * 给定一个大小为 n 的数组 nums ，返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
     *
     * 你可以假设数组是非空的，并且给定的数组总是存在多数元素。
     *
     * 示例 1：
     *
     * 输入：nums = [3,2,3]
     * 输出：3
     * 示例 2：
     *
     * 输入：nums = [2,2,1,1,1,2,2]
     * 输出：2
     *  
     * 提示：
     * n == nums.length
     * 1 <= n <= 5 * 104
     * -109 <= nums[i] <= 109
     *
     * 进阶：尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/majority-element
     */
    /**
     *解法：
     * 选举法：
     * 初始设置选举人是nums[0],选票是1，
     * 遍历nums,若nums[i] = 选举人，选票 +1，否则选票 -1
     * 若选票为0，则nums[i]为最新选举人
     * 根据题意，多数元素出现的次数大于2/n，所以，不论什么样的顺序，最后的选举人都是多数元素
     *
     * 其他解法：
     * 排序：按照升序或者降序排列数组，下标为2/n的元素，一定是多数元素
     * 暴力破解：遍历nums,每个元素出现的次数，都缓存下来，再取出现次数最多的元素，就是多数元素
     *
     * @param nums
     * @return
     */
    public int majorityElement(int[] nums) {
        int count = 1;
        int n = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if(count == 0){
                n = nums[i];
            }
            if(n == nums[i]){
                count ++;
            }else{
                count --;
            }
        }
        return  n;
    }
}
